package cn.iocoder.yudao.module.im.service;

import cn.iocoder.yudao.module.im.dal.dataobject.ImGroupDO;

import java.util.List;

/**
 * 群组服务接口
 *
 * @author 芋道源码
 */
public interface ImGroupService {

    /**
     * 创建群组
     *
     * @param groupDO 群组信息
     * @return 群组ID
     */
    Long createGroup(ImGroupDO groupDO);

    /**
     * 获取群组详情
     *
     * @param groupId 群组ID
     * @return 群组详情
     */
    ImGroupDO getGroup(Long groupId);

    /**
     * 更新群组信息
     *
     * @param groupDO 群组信息
     * @return 是否更新成功
     */
    boolean updateGroup(ImGroupDO groupDO);

    /**
     * 解散群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否解散成功
     */
    boolean dissolveGroup(Long groupId, Long userId);

    /**
     * 查询创建者的群组列表
     *
     * @param creatorId 创建者ID
     * @return 群组列表
     */
    List<ImGroupDO> getGroupListByCreatorId(Long creatorId);

    /**
     * 加入群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否加入成功
     */
    boolean joinGroup(Long groupId, Long userId);

    /**
     * 退出群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否退出成功
     */
    boolean exitGroup(Long groupId, Long userId);

    /**
     * 踢出群组成员
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作者ID
     * @return 是否踢出成功
     */
    boolean kickMember(Long groupId, Long userId, Long operatorId);

    /**
     * 设置群成员身份
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param memberType 成员类型
     * @param operatorId 操作者ID
     * @return 是否设置成功
     */
    boolean setMemberType(Long groupId, Long userId, Integer memberType, Long operatorId);

    /**
     * 发布群公告
     *
     * @param groupId 群组ID
     * @param title 公告标题
     * @param content 公告内容
     * @param publisherId 发布者ID
     * @return 公告ID
     */
    Long publishAnnouncement(Long groupId, String title, String content, Long publisherId);

}